package com.bart.scala.ch11

/**
 * 隐式参数
 * 函数、方法可以带有一个标记伟implicit的参数列表，如果调用的时候不传入该参数，编译器会查找默认值
 *
 * 查找路径：
 * 1）当前作用域所有可以用单个标识符指代满足类型要求的val和def变量
 * 2）该值需要声明为implicit
 * 3）与所要求类型相关联的类型的伴生对象，相关联的类型包括所要求的类型本身，以及它的类型参数
 */

case class Delimiters(left:String, right:String)

object FrenchRunctuation {
  implicit  val frenchRunctuation = Delimiters("<<", ">>")
}

object MainApp3 extends App {
  /**
   * 隐式参数
   */
  def quote(what:String)(implicit delims: Delimiters) = delims.left + what + delims.right

  // 1）显示的指明
  val s1 = quote("yes")(new Delimiters("$$", "$$"))
  println(s1)//$$yes$$

  // 2）隐式调用
  // 需要引入
  import FrenchRunctuation._
  val s2 = quote("nice")
  println(s1)//<<yes>>
}
